/**
 * 事件处理函数的类型
 */
type EvHandler = <T extends HTMLElement>(el: T, ev: Event) => void;

/**
 * 为元素添加事件监听器
 *
 * @param selector 元素选择器
 * @param eType 事件类型
 * @param handler 事件处理函数，会向该函数的第一个参数传递元素对象，
 * 向第二个参数传递事件对象
 * @return true 为元素添加事件监听器成功；false 由于找不到元素导致无法为元素添加事件监听器
 */
export const addEvListener = <T extends HTMLElement>(selector: string, eType: string, handler: EvHandler): boolean => {
    let element = document.querySelector(selector);
    if (!element) {
        return false
    }
    element.addEventListener(eType, (event: Event) => {
        handler<T>(element as T, event)
    })
    return true
}

/**
 * 为元素添加 “动画执行完成” animationend 事件监听器
 *
 * @param selector 元素选择器
 * @param handler 事件处理函数，会向该函数的第一个参数传递元素对象，
 * 向第二个参数传递事件对象
 * @return true 为元素添加事件监听器成功；false 由于找不到元素导致无法为元素添加事件监听器
 */
export const addAnimationendListener = <T extends HTMLElement>(selector: string, handler: EvHandler): boolean => {
    return addEvListener<T>(selector, 'animationend', handler)
}
